/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux;

/** 
 * UXContainerクラス
 * 複数のUXObjectインタンスを子として持つコンテナクラスです。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id: UXObject.hx 45 2009-02-20 12:14:01Z ogasawara.satoshi $<br>
 */
class UXContainer
{
	// {{{ properties
	// {{{ public var parent : Null<T>
	/**
	 * 親コンテナ
	 */
	public var parent : Null<XXObj>;
	// }}}
	// {{{ private var _children : Array<UXObject>;
	/**
	 * 子オブジェクト
	 */
	private var _children : Array<UXObject>;
	// }}}
	// }}}	
	// {{{ public function new()
	/**
	 * コンストラクタ.
	 */
	public function new()
	{
		parent = null;
		_children = new Array();
	}

	// }}}
	// {{{ public function addChild( child : T ) : Void
	/**
	 * 子要素を加えます。
	 */
	public function addChild( child : UXObject ) : Void
	{
		_children.push( child );
	}

	// }}}
	// {{{ public function addChildAt( child : T, index : Int ) : Void
	/**
	 * 子要素を指定の場所に加えます。indexの場所以降にあった子要素はひとつづつ後ろにずれます。
	 */
	public function addChildAt( child : UXObject, index : Int ) : Void
	{
		if ( index>=0 && index<_children.length ) {
			_children[index] = child;
		}
	}

	// }}}
	// {{{ public function contains( child : T ) : Bool
	/**
	 * 指定された子要素が含まれているかどうかを調べます。
	 */
	public function contains( child : UXObject ) : Bool
	{
		var ret:Bool = false;
		for ( c in _children ) {
			if ( c==child ) {
				ret = true;
			}
		}
		return ret;
	}

	// }}}
	// {{{ public function getChildAt( index : Int ) : Null<T>
	/**
	 * index番号で指定された場所の子要素を返します。index番号が子要素の数と同じか多い場合には、nullを返します。
	 */
	public function getChildAt( index : Int ) : Null<UXObject>
	{
		if ( index>=0 && index<_children.length ) {
			return _children[index];
		}
		return null;
	}

	// }}}
	// {{{ public function removeChild( child : T ) : Void
	/**
	 * 指定された子要素をコンテナから削除します。
	 */
	public function removeChild( child : UXObject ) : Void
	{
		_children.remove(child);
	}

	// }}}
	// {{{ public function removeChildAt( index : Int ) : Void
	/**
	 * 指定されたindex番号の位置にある子要素をコンテナから削除します。
	 */
	public function removeChildAt( index : Int ) : Void
	{
		if ( index>=0 && index<_children.length ) {
			var c:Null<UXObject> = _children[index];
			_children.remove(c);
		}
	}

	// }}}
	// {{{ public function clearChildren() : Void
	/**
	 * 全ての子要素をコンテナから削除します。
	 */
	public function clearChildren() : Void
	{
		_children = new Array();
	}

	// }}}
	// {{{ public function swapChild( i1 : Int, i2 : Int ) : Void
	/**
	 * 子要素の順番を入れ替えます。
	 */
	public function swapChild( i1 : Int, i2 : Int ) : Void
	{
		var c1:Null<UXObject> = _children[i1];
		var c2:Null<UXObject> = _children[i2];
		_children[i2] = c1;
		_children[i1] = c2;
		/*
		#if flash9
		#elseif flash
		#end
		*/
	}
	// }}}
}
